﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Drawing;
using DevExpress.XtraGrid.Views.Grid;
using ProtocolVN.Framework.Core;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid;

namespace ProtocolVN.Framework.Win
{

    /// <summary>
    /// DUYVT
    /// Ràng buộc này sử dụng cho các loại phiếu mà 1 hàng hóa phân biệt thông qua ID
    /// </summary>
    public class RangBuocSoLgTrLgGiaCong : RangBuocRule
    {
        #region RangBuocRule Members
        DataTable ConLai;
        PhieuType Src;
        long SrcID;
        PhieuType Des;
        long DesID;
        object DesObj;
        PLGridView DesGrid;

        public RangBuocSoLgTrLgGiaCong() { }

        public RangBuocSoLgTrLgGiaCong(PhieuType Src, long SrcID, PhieuType Des, long DesID, 
            object DesObj, PLGridView DesGrid)
        {
            this.Src = Src;
            this.SrcID = SrcID;
            this.Des = Des;
            this.DesID = DesID;
            this.DesObj = DesObj;
            this.DesGrid = DesGrid;
        }

        //Trả về số lượng, trọng lượng còn lại có thể chấp nhận
        private bool Check(PhieuType Src, long SrcID, List<object[]> LObj, PhieuType Des, 
            long DesID, object DesObj, PLGridView DesGrid)
        {
            ISoLgTrLg data = (ISoLgTrLg)DesObj;
            //Tạo DataTable(HH_ID, SO_LUONG, TRONG_LUONG)
            DataTable dt_lienquan = RangBuocSoLgTrLgHelp.CreateDTHangHoa(LObj, DesID);
            DataTable dt_sum = RangBuocSoLgTrLgHelp.CreateDTHangHoa(Src, SrcID,"_CT2");
        
            //Lấy HH_ID, SO_LUONG, TRONG_LUONG cua DesObj nếu tồn tại
            if (data != null)
            {
                DataTable dt_des = data.GetSoLgTrLg();
                //Merge thêm vào dt_lienquan từ dt_des
                RangBuocSoLgTrLgHelp.MergeAddHangHoa(ref dt_lienquan, dt_des);
            }     
            //Kiểm tra ràng buộc về số lượng và trọng lượng
            //Kết quả trả về DataTable miêu tả các dòng vi phạm
            DataTable dt_vipham = RangBuocSoLgTrLgHelp.KiemTraRangBuoc(dt_sum, dt_lienquan);
            if (dt_vipham.Rows.Count != 0 && DesGrid != null)            
                RangBuocSoLgTrLgHelp.ShowErrorOnGrid(DesGrid, dt_vipham);            

            //Merge giảm vào dt_sum từ dt_lienquan
            RangBuocSoLgTrLgHelp.MergeMinusHangHoa(ref dt_sum, dt_lienquan);
            //Set số lượng còn lại
            ConLai = dt_sum;

            //Nếu dt_vipham không tồn tại dòng vi phạm và phiếu nguồn chưa tạo hết phiếu liên quan
            bool flag = false;            
            if (data != null)
            {
                if (dt_vipham.Rows.Count == 0)
                    flag = true;
            }
            else 
            {
                if (RangBuocSoLgTrLgHelp.KiemTraTaoPhieu(ConLai))
                    flag = true;
            }
            return flag;
        }
        
        public DataTable GetConLai()
        {
            foreach (DataRow dr in ConLai.Rows)
            {
                if (HelpNumber.ParseDecimal(dr["SO_LUONG"]) <= 0 ||
                    HelpNumber.ParseDecimal(dr["TRONG_LUONG"]) <= 0)
                {
                    dr.Delete();
                }
            }
            return ConLai;
        }
        #endregion

        #region RangBuocRule Members

        public List<InvalidInfo> Check()
        {
            List<InvalidInfo> ret = new List<InvalidInfo>();
            List<object[]> LObj = DAPhieuLienQuan.GetListPhieuLienQuan(SrcID, Src, Des);
            bool flag = Check(Src, SrcID, LObj, Des, DesID, DesObj, DesGrid);
            if (flag == false)
            {
                ret.Add(new InvalidInfo(
                    "Vi phạm ràng buộc số lượng, trọng lượng", 
                    "Vui lòng kiểm tra lại các thông tin liên quan số lượng và trọng lượng", 
                    InvalidInfo.InvalidType.ERROR));
            }
            return ret;
        }

        #endregion

        public static bool Check(RangBuocSoLgTrLgGiaCong rule, PhieuType Src, long SrcID, 
            PhieuType Des, long DesID, Object DesObj, PLGridView DesGrid)
        {
            //Lay danh sach cac phieu thuoc nhom phieu des duoc tao tu (Src, SrcID)
            //Duoc xay dung tu PhieuLienQuan List (TYPE_ID, ID)            
            List<object[]> LObj = DAPhieuLienQuan.GetListPhieuLienQuan(SrcID, Src, Des);
            return rule.Check(Src, SrcID, LObj, Des, DesID, DesObj, DesGrid);
        }
        //VULA: Merge thêm cột ghi chú
        public static DataSet GetGhiChu(DataSet _DataSetNguon, DataSet DataSetConLai)
        {
            DataSetConLai.Tables[0].Columns.Add("GHI_CHU");
            if (DataSetConLai != null && _DataSetNguon != null)
            {
                foreach (DataRow dr in DataSetConLai.Tables[0].Rows)
                {
                    if (dr.RowState == DataRowState.Deleted) continue;
                    foreach (DataRow drPN in _DataSetNguon.Tables[0].Rows)
                    {
                        if (dr["HH_ID"].ToString().Equals(drPN["HH_ID"].ToString()))
                        {
                            dr["GHI_CHU"] = drPN["GHI_CHU"];
                            break;
                        }
                    }
                }
            }
            return DataSetConLai;
        }
    }
    
   
}
